package org.lpw.wormhole.util;

import org.slf4j.LoggerFactory;

/**
 * @author lpw
 */
public class LoggerImpl
    implements Logger
{
    private static final String[] THROWABLES = {"< ", " > ", "    "};

    protected org.slf4j.Logger logger;

    @Override
    public boolean isDebugEnable()
    {
        return getLogger().isDebugEnabled();
    }

    @Override
    public void debug(String message)
    {
        getLogger().debug(message(null, message));

    }

    @Override
    public boolean isInfoEnable()
    {
        return getLogger().isInfoEnabled();
    }

    @Override
    public void info(String message)
    {
        getLogger().info(message(null, message));
    }

    @Override
    public void warn(Throwable throwable, String message)
    {
        getLogger().warn(message(throwable, message));
    }

    /**
     * 获取日志管理器。
     * 
     * @return 日志管理器。
     */
    protected org.slf4j.Logger getLogger()
    {
        if(logger==null)
            logger = LoggerFactory.getLogger(Logger.class);

        return logger;
    }

    /**
     * 拼装日志信息。
     * 
     * @param throwable
     *            异常；如果为null则忽略。
     * @param message
     *            要输出的信息；如果为null则忽略。
     * @return 日志信息。
     */
    protected String message(Throwable throwable, String message)
    {
        StringBuilder sb = new StringBuilder().append(Thread.currentThread().getStackTrace()[3].getClassName()).append(' ');

        if(throwable!=null)
        {
            sb.append(THROWABLES[0]).append(throwable.getClass().getName()).append(THROWABLES[1]).append(throwable.getMessage()).append('\n');
            for(StackTraceElement stackTrace : throwable.getStackTrace())
                sb.append(THROWABLES[2]).append(stackTrace).append('\n');
        }

        if(message!=null)
            sb.append(message);

        return sb.toString();
    }
}
